﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//using VHslCommDemo.PLC.Turck;

//namespace VIA.SiMoJi.Domain.SoftPLC
//{
//    public interface IInstruction
//    {
//        public string Annotation { get; set; }
//        public void Run();
//        public bool Check(out string error);
//        public void AddNodes(ILadderDiagramNode node);
//    }

//    public class Instruction : IInstruction, ILadderDiagramNode
//    {
//        public string Annotation { get; set; }
//        public IOutPutNode OutPutNode { get; set; }
//        public List<ILadderDiagramNode> LadderDiagramNodes { get; set; } = new();

//        public Instruction()
//        {
//        }

//        public Instruction(string annotation)
//        {
//            Annotation = annotation;
//        }

//        public void Run()
//        {
//            try
//            {
//                bool isGoOn = GetContinuous();
//                OutPutNode.SetOutput(isGoOn);
//            }
//            catch (Exception)
//            {
//                throw;
//            }
//        }

//        public bool GetContinuous()
//        {
//            try
//            {
//                bool isGoOn = true;
//                bool isBreak = false;
//                List<int> tempFlags = new();
//                int? currentFlag = null;
//                foreach (var item in LadderDiagramNodes)
//                {
//                    if (item is ParallelStartFlag flag)
//                    {
//                        if ((isGoOn && currentFlag != flag.Flag) || (!isGoOn && currentFlag == flag.Flag))
//                        {
//                            if (!tempFlags.Contains(flag.Flag)) tempFlags.Add(flag.Flag);
//                            currentFlag = flag.Flag;
//                        }
//                        else
//                        {
//                            isBreak = true;
//                        }
//                    }
//                    else if (item is ParallelEndFlag flagEnd)
//                    {
//                        if (tempFlags.Count > 0) currentFlag = tempFlags[tempFlags.Count - 1];
//                        else currentFlag = null;

//                    }
//                    else
//                    {
//                        if (isBreak) continue;
//                        isGoOn = item.GetContinuous();
//                    }
//                }
//                return isGoOn;
//            }
//            catch (Exception)
//            {

//                throw;
//            }
//        }

//        public bool Check(out string error)
//        {
//            error = string.Empty;
//            var parallelFlags = LadderDiagramNodes.Where(x => (x is ParallelStartFlag) || (x is ParallelEndFlag));
//            List<int> tempFlags = new();
//            int? currentFlag = null;
//            foreach (var item in parallelFlags)
//            {
//                if (item is ParallelStartFlag flag)
//                {
//                    if (!tempFlags.Contains(flag.Flag)) tempFlags.Add(flag.Flag);
//                    currentFlag = flag.Flag;
//                }
//                else if (item is ParallelEndFlag flagEnd)
//                {
//                    if (currentFlag != flagEnd.Flag)
//                    {
//                        error = $"流程设计错误：分支结束点不是当前所在的分支！";
//                        return false;
//                    }
//                }
//            }
//            if (tempFlags.Count > 0)
//            {
//                error = $"流程设计错误：存在没有结束的分支！";
//                return false;
//            }
//            return true;
//        }

//        public void AddNodes(ILadderDiagramNode node)
//        {
//            LadderDiagramNodes.Add(node);
//        }
//    }
//}
